package com.pan.behavioral.stratergy;

import com.pan.behavioral.stratergy.game.ClickGame;
import com.pan.behavioral.stratergy.shop.Shop;
import com.pan.behavioral.stratergy.shop.strategy.CommonConsumerStrategy;
import com.pan.behavioral.stratergy.shop.strategy.VIPConsumerStrategy;

/**
 *
 * 策略模式的核心思想是定义一系列的算法，将每个算法封装起来，并使它们可以相互替换。
 * 策略模式，其实函数式编程也可以被视作策略模式的一个实现
 *
 * 在程序的设计模式里，桥接模式、 状态模式和策略模式 、适配器模、模板方法模式的思想是类似的。即是将状态或者方法抽象出来形成一个对象，
 * 再将这个对象委托给别的类， 比如策略模式主要将“策略”抽象出来，状态模式将“状态”抽象出来，然后把这个东西委托给别的类
 *
 */
public class StrategyApplication {
    public static void main(String[] args) {
        Shop shop = new Shop();
        System.out.println("普通顾客：");
        shop.setStrategy(new CommonConsumerStrategy());
        for (int i = 0; i < 10; i++) {
            double goodsPrices = Math.random() * 200;
            System.out.println("商品价格："+goodsPrices);
            shop.CheckOut(goodsPrices);
        }
        System.out.println("vip顾客：");
        shop.setStrategy(new VIPConsumerStrategy());
        for (int i = 0; i < 10; i++) {
            double goodsPrices = Math.random() * 200;
            System.out.println("商品价格："+goodsPrices);
            shop.CheckOut(goodsPrices);
        }
    }
}
